home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr33 / timever.zip / TIMEVER.PAS < prev   
Pascal/Delphi Source File  |  1993-06-10  |  8KB  |  208 lines

  1. {
  2.  *****************************************************************************
  3.  * Name .......... TIMEVER.PAS
  4.  * Description ... Utility to set the time (and optional date) of a file to
  5.  *                 it's version number.
  6.  * Programmer .... F. Martin Richardson, Jr.
  7.  * Date Created .. October 12, 1991
  8.  * Language ...... Turbo Pascal v6.0
  9.  ******************************************************************************
  10.  * This file is hereby public domain and may be used in any way either public
  11.  * or commercial.  Enjoy!
  12.  ******************************************************************************
  13.  * NOTES:
  14.  *
  15.  * Turbo Pascal makes this easy.  Simply assign the file name to a file 
  16.  * variable and use the SETFTIME on it to set the file time.  
  17.  *
  18.  * Major Version number is the number to the left of the dot.
  19.  * Minor Version number is the number to the right of the dot.
  20.  * (eg, v3.21 .. Major Version Number: 3, Minor Version Number: 21)
  21.  *
  22.  * Just press enter when prompted for a file spec when done entering.
  23.  *
  24.  * Since current versions of DOS report the time of a file in AM/PM format,
  25.  * entering in a minor version number (or minutes) of 13 or greater will
  26.  * be reported as 1 or greater (just subtract 12).  (eg, 13:52 is reported
  27.  * by DOS as 1:52p).  To get a version number greater than 12, simply add
  28.  * 12 to it! (eg, version 16 is entered as 28 (16+12)).
  29.  *
  30.  * Maximum values:
  31.  *   Major Version Number (Hours)  : 31 (19 shown due to am/pm)
  32.  *   Minor Version Number (Minutes): 63
  33.  *   Day                           : 31
  34.  *   Month                         : 15
  35.  *   Year                          : 1980-2107
  36.  *
  37.  * Entering values outside of these ranges may get the result you desire, but
  38.  * more oft than not you will wind up with some other number there, with the
  39.  * rest of your values wrong as well!  Experiment and see what you can come
  40.  * up with!
  41.  *****************************************************************************
  42. }
  43.  
  44. {$X+,V-}
  45. USES DOS, CRT;
  46.  
  47. TYPE
  48.      ArrayType = ARRAY[1..20] OF STRING;
  49.  
  50. VAR
  51.    FileArray: ArrayType;
  52.    DateInfo: DATETIME;
  53.    FileTime: LONGINT;
  54.    Major, Minor: WORD;
  55.    nIndex, NumFiles: INTEGER;
  56.    s: SEARCHREC;
  57.    f: FILE;
  58.    Month, Day: STRING[2];
  59.    Year: STRING[4];
  60.    DateChange: STRING[1];
  61.  
  62. {*****************************************************************************
  63.  * Function ...... ItoS()
  64.  * Purpose ....... To convert an integer/long integer to string format
  65.  * Parameters .... nNum       Integer to convert
  66.  *                 nLength    Length of resultant string
  67.  * Returns ....... <nNum> as a string <nLength> characters in length.
  68.  * Notes ......... TP does this already with the STR procedure, but functions
  69.  *                 are far more useful.
  70.  *               . Passing a length of 0 will return a string the length of
  71.  *                 the number.
  72.  * Author ........ Martin Richardson
  73.  *****************************************************************************}
  74. FUNCTION ItoS( nNum: LONGINT; nLength: INTEGER ): STRING;
  75. VAR sString: STRING;
  76. BEGIN
  77.      IF nLength > 0 THEN
  78.          STR( nNum:nLength, sString )
  79.      ELSE
  80.          STR( nNum:0, sString );
  81.      ITOS := sString;
  82. END;
  83.  
  84. {*****************************************************************************
  85.  * Function ...... StoI()
  86.  * Purpose ....... To convert a string to an integer format integer
  87.  * Parameters .... sNum       String to convert
  88.  * Returns ....... <sNum> as an integer.
  89.  * Notes ......... TP does this already with the VAL procedure, but functions
  90.  *                 are far more useful.
  91.  * Author ........ Martin Richardson
  92.  *****************************************************************************}
  93. FUNCTION StoI( sNum: STRING ): LONGINT;
  94. VAR c : INTEGER;
  95.     i : LONGINT;
  96. BEGIN
  97.      VAL( sNum, i, c );
  98.      STOI := i;
  99. END;
  100.  
  101. {*****************************************************************************
  102.  * Function ...... Empty()
  103.  * Purpose ....... To determine if a string is empty.
  104.  * Parameters .... sString         String to determine empty-ness
  105.  * Returns ....... True if <sString> is empty
  106.  * Notes ......... Definition of empty: 0 length, or contains spaces only
  107.  * Author ........ Martin Richardson
  108.  *****************************************************************************}
  109. FUNCTION Empty( sString: STRING ): BOOLEAN; ASSEMBLER;
  110. ASM
  111.        CLD                          { We want to go left to right }
  112.        XOR   CH, CH                 { Zero out CH }
  113.        LES   DI, sString            { Point ES:DI at sString }
  114.        MOV   CL, BYTE PTR ES:[DI]   { Load string length into CL }
  115.        JCXZ  @@1                    { 0 Length?  Then empty! }
  116.        INC   DI                     { Point to first character of string }
  117.        MOV   AL, ' '                { Compare it to a space }
  118.        REPE  SCASB                  { Compare AL to each byte in [ES:DI] }
  119.        JZ    @@1                    { All spaces, so it must be empty! }
  120.        MOV   AL, False              { We hit a non-space, so not empty }
  121.        JMP   @@2                    { To avoid setting back to true }
  122. @@1:   MOV   AL, True               { Empty! }
  123. @@2:
  124. END;
  125.  
  126. {*****************************************************************************
  127.  * Function ...... GetPath()
  128.  * Purpose ....... To return the path (minus the file name) from a path 
  129.  *                 string.
  130.  * Parameters .... sPath      Path string from which to extract the path
  131.  *                            minus the file spec.
  132.  * Returns ....... Path string with no file name attached.
  133.  * Notes ......... Trailing slash *IS* included if present
  134.  *                 (eg, GetPath("C:\DOS\COMMAND.COM") returns "C:\DOS\",
  135.  *                      GetPath("C:COMMAND.COM") returns "C:" )
  136.  * Author ........ Martin Richardson
  137.  *****************************************************************************}
  138. FUNCTION GetPath( sPath: STRING ): STRING;
  139. VAR sDir  : DirStr;
  140.     sName : NameStr;
  141.     sExt  : ExtStr;
  142. BEGIN
  143.      FSPLIT( sPath, sDir, sName, sExt );
  144.      GetPath := sDir;
  145. END;
  146.  
  147. {****************************************************************************
  148.  * Main Routine
  149.  ****************************************************************************}
  150.  
  151. BEGIN
  152.      WRITELN( 'TIMEVER by Martin Richardson' );
  153.      WRITELN;
  154.      WRITE( 'Enter MAJOR version number: ' );
  155.      READLN( Major );
  156.      WRITE( 'Enter MINOR version number: ' );
  157.      READLN( Minor );
  158.      WRITELN;
  159.  
  160.      WRITE( 'Change date as well? ' );
  161.      READLN( DateChange );
  162.  
  163.      IF (DateChange[1] IN ['Y','y']) THEN BEGIN
  164.         WRITELN;
  165.         WRITE( 'Enter month: ' );
  166.         READLN( Month );
  167.         WRITE( 'Enter day: ' );
  168.         READLN( Day );
  169.         REPEAT
  170.               WRITE( 'Enter year : ' );
  171.               READLN( Year );
  172.         UNTIL LENGTH( Year ) < 4;
  173.         IF LENGTH( Year ) < 4 THEN Year := ItoS( StoI(Year) + 2000, 0 );
  174.      END { IF };
  175.  
  176.      WRITELN;
  177.  
  178.      NumFiles := 0;
  179.      REPEAT
  180.            INC( NumFiles );
  181.            WRITE( 'Enter File Spec [' + ItoS( NumFiles, 0 )+']: ' );
  182.            READLN( FileArray[NumFiles] );
  183.      UNTIL (NumFiles > 19) OR (Empty( FileArray[NumFiles] ));
  184.      IF Empty( FileArray[NumFiles] ) THEN DEC( NumFiles );
  185.  
  186.      FOR nIndex := 1 TO NumFiles DO BEGIN
  187.          FindFirst( FileArray[NumFiles], AnyFile, s );
  188.          WHILE (DOSError = 0) DO BEGIN
  189.                WRITELN( 'Changing ', GetPath(FileArray[NumFiles]) + s.name, '...' );
  190.                ASSIGN( f, GetPath(FileArray[NumFiles]) + s.name );
  191.                GETFTIME( f, FileTime );
  192.                UNPACKTIME( FileTime, DateInfo );
  193.                DateInfo.Hour     := Major;
  194.                DateInfo.Min      := Minor;
  195.                IF (DateChange[1] IN ['Y','y']) THEN BEGIN
  196.                   DateInfo.Month := StoI( Month );
  197.                   DateInfo.Day   := StoI( Day );
  198.                   DateInfo.Year  := StoI( Year );
  199.                END { IF };
  200.                PACKTIME( DateInfo, FileTime );
  201.                RESET( f );
  202.                SETFTIME( f, FileTime );
  203.                CLOSE( f );
  204.                FINDNEXT( s );
  205.          {W}END;
  206.      END { NEXT nIndex };
  207. END.
  208.